
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @program: data_structures_algorithms
 * @description: 后缀表达式(逆波兰表达式)
 * @author: lld
 * @create: 2020/08/17 22:29
 **/
public class SuffixExpression {
    public static void main(String[] args) {
//
        String a = "2 3 + 3 * 40 2 / -";//(2+3)*3-40/2 =>2 3 + 3 * 40 2 / - =-5
        String b = "3 4 + 5 * 6 -";
        String[] split = a.split(" ");
        List<String> list = new ArrayList<>();
        for (String s : split) {
            list.add(s);
        }
        System.out.println("(2+3)*3-40/2=" + calculate(list));
    }

    public static int calculate(List<String> list) {

//        创建栈
        Stack<String> stack = new Stack<>();
        for (String s : list) {
            if (s.matches("\\d+")) {//匹配到整数
                stack.push(s);
            } else {
//                匹配到操作符，pop出两个数
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0;
                switch (s) {
                    case "+":
                        res = num1 + num2;
                        break;
                    case "-":
                        res = num1 - num2;
                        break;
                    case "*":
                        res = num1 * num2;
                        break;
                    case "/":
                        res = num1 / num2;
                        break;
                    default:
                        System.out.println("运算符有误");
                        break;
                }
                stack.push(String.valueOf(res));
            }
        }
        return Integer.parseInt(stack.pop());
    }
}
//直接遍历数组
//public static int  calculate(String a){
//        String[] split = a.split(" ");
////        创建栈
//        Stack<String> stack=new Stack<>();
//        for (String s : split) {
//            if(s.matches("\\d+")){//匹配到整数
//                stack.push(s);
//            }else{
////                匹配到操作符，pop出两个数
//                int num2=Integer.parseInt(stack.pop());
//                int num1=Integer.parseInt(stack.pop());
//                int res;
//                switch (s){
//                    case "+": res=num1+num2;
//                    break;
//                    case "-": res=num1-num2;
//                    break;
//                    case "*": res=num1*num2;
//                    break;
//                    case "/": res=num1/num2;
//                    break;
//                    default:
//                        throw new RuntimeException("运算符有误");
//                }
//                stack.push(String.valueOf(res));
//            }
//        }
//        return Integer.parseInt(stack.pop());
//    }
//}
